最近在准备面试,当然算法是必不可少的,但是自己平常做的更多的是工程方面的东西,涉及到的最多就是数据结构浅层的东西,还没有花很大的精力来研究算法,但是面试中算法肯定是不可缺少的,所以这几天一直在恶补算法,今天看 算法导论 时看到了动态规划算法,看书怎么也看不懂,于是乎上网搜了一下,结果搜到了知乎上的结果,见知乎之关于动态规划问题的探讨,感觉前两位朋友说的实在是太赞了,不仅是帮我理解了动态规划算法的思想和本质,帮我区分开了递推,贪心,动态规划和搜索的不同,更重要的是他们让我在认识问题上上升到了一个新的高度,即从状态和状态转换来认识IT问题,这实在是太精辟了,很多时候我们解决不了问题就是因为我们看待问题的角度不对,果然思想的高度才是真正的高度啊!!!
下面先总结一下我从上述两位知乎网友的回答中收获的心得:
- 把问题描述的更”IT“一些,也就是用更接近数学和计算机的语言来把原来的实际问题抽象化,这样很有利于我们用更清晰的思路去解决问题
- 在上述进一步抽象的问题描述中找准状态和状态之间的转化关系
- 关于上面说的几种算法思想的区分,这里引用一下上述知乎网友@王勐的回答:
- 每个阶段只有一个状态—>递推(例如Fibonacci数列)
- 每个阶段的最优状态都是由上一个阶段的最优状态得到的—>贪心(例如背包问题)
- 每个阶段的最优状态是由之前所有状态的组合得到的—>搜